c23766
@@ -121,21 +121,19 @@
public static long parseOctal(final byte[] buffer, final int offset, final int l
             }
         }
 
-        // Must have trailing NUL or space
-        byte trailer;
-        trailer = buffer[end-1];
-        if (trailer == 0 || trailer == ' '){
-            end--;
-        } else {
-            throw new IllegalArgumentException(
-                    exceptionMessage(buffer, offset, length, end-1, trailer));
-        }
-        // May have additional NULs or spaces
-        trailer = buffer[end - 1];
-        while (start < end - 1 && (trailer == 0 || trailer == ' ')) {
+        // Trim all trailing NULs and spaces.
+        // The ustar and POSIX tar specs require a trailing NUL or
+        // space but some implementations use the extra digit for big
+        // sizes/uids/gids ...
+        byte trailer = buffer[end - 1];
+        while (start < end && (trailer == 0 || trailer == ' ')) {
             end--;
             trailer = buffer[end - 1];
         }
+        if (start == end) {
+            throw new IllegalArgumentException(
+                    exceptionMessage(buffer, offset, length, start, trailer));
+        }
 
         for ( ;start < end; start++) {
             final byte currentByte = buffer[start];
